<?php if(!function_exists('startedIndexPhp')) { header("location:../index.php"); exit();}

# streber - a php based project management system
# Copyright (c) 2005 Thomas Mann - thomas@pixtur.de
# Distributed under the terms and conditions of the GPL as stated in docs/license.txt


/**
* \file  pages related to comments  
* 
* itemperson is a join table between each person and all other items. This
* table can be used for listing, how often a page is been used by whom.
* It is also used for handling bookmarks and notification on items.
*
**/

require_once ("db/db.inc.php");


global $g_itemperson_fields;
$g_itemperson_fields=array();
foreach(array(
            ### internal fields ###
            new FieldInternal(array('name'=>'id',
                'default'=>0,
            )),
            new FieldInternal(array('name'=>'person',
                'default'=>0,
            )),
            new FieldInternal(array('name'=>'item',
                'default'=>0,
            )),
            new FieldInternal(array('name'=>'viewed',
                'view_in_forms'=>false,
            )),
            new FieldDatetime(array('name'=>'viewed_last',
                'default'=>FINIT_NEVER,
                'view_in_forms'=>false,
            )),
            new FieldInternal(array('name'=>'view_count',
                'view_in_forms'=>false,
                'default'       => 1,
            )),
            new FieldInternal(array('name'=>'is_bookmark',
                'default'=>0,
                'view_in_forms'=>false,
            )),
            new FieldInternal(array('name'=>'notify_on_change',
                'default'=>0,
                'view_in_forms'=>false,
            )),
            new FieldInternal(array('name'=>'notify_if_unchanged',  # time
                'default'=>0,
                'view_in_forms'=>false,
            )),
            new FieldText(array(
                'name'=>'comment',
                'title'=>__('Comment','form label for items'),
                'tooltip'=>__('Optional'),
                'log_changes'=>true,
            )),
            new FieldDatetime(array('name'=>'notify_date',
                'default'=>FINIT_NEVER,
                'view_in_forms'=>false,
            )),
            new FieldDatetime(array('name'=>'created',
                'default'=>FINIT_NEVER,
                'view_in_forms'=>false,
            )),
            new FieldInternal(array('name'=>'feedback_requested_by',
                'default'=>0,
                'view_in_forms'=>false,
            )),
       ) as $f) {
            $g_itemperson_fields[$f->name]=$f;
       }

class ItemPerson extends DbItem
{

    public $fields_itemperson;
    private $_values_org = array();
    public $children = array();

    public function __construct($id_or_array=NULL)
    {
        global $g_itemperson_fields;
        $this->fields = &$g_itemperson_fields;
        /**
        *  this->_type holds a string for the current type
        *  which is used for accessing db-tables and
        *  form-parameter-passing (therefore it has to be lowercase)
        */
        $this->_type = strtolower(get_class($this));

        /**
        * add default fields if not overwritten by derived class
        */
        if(!$this->fields) {
            global $g_itemperson_fields;
            $this->fields = &$g_itemperson_fields;
        }

        /**
        * if array is passed, create a new empty object with default-values
        */
        parent::__construct();

        if(is_array($id_or_array)) {
            parent::__construct();
            foreach($id_or_array as $key => $value) {
                is_null($this->$key); ### cause E_NOTICE on undefined properties
                $this->$key=$value;
            }
        }

        /**
        * if int is passed, it's assumed to be ITEM-ID
        * - query item-tables
        * - query table with name of object-type
        */
        else if(is_int($id_or_array)) {
            parent::__construct($id_or_array);
        }
        #--- just empty ----
        else {
            trigger_error("can't construct zero-id item",E_USER_WARNING);
            parent::__construct();
            return NULL;
        }
    }

    /**
    * query from db
    *
    * - returns NULL if failed
    */
    static function getById($id)
    {
        $i = new ItemPerson( intval($id));
        if($i->id) {
            return $i;
        }
        return NULL;
    }

    function getItemModified(){
        if($i = DbProjectItem::getById($this->item)){
            $mod_date = $i->modified;
            return $mod_date;
        }
        else{
            return NULL;
        }
    }

    static function getAll($args=NULL){

        global $auth;

        $prefix = confGet('DB_TABLE_PREFIX');
        $dbh = new DB_Mysql;

        ## default parameter ##
        $id               = NULL;
        $person           = $auth->cur_user->id;
        $item             = NULL;
        $viewed           = NULL;
        $is_bookmark      = NULL;
        $feedback_requested_by = NULL;
        $notify_on_change = NULL;
        $notify_if_unchanged_min = NULL;
        $notify_if_unchanged_max = NULL;
        $order_by         = "ip.created DESC";
        
        ### filter params ###
        if($args) {
            foreach($args as $key=>$value) {
                if(!isset($$key) && !is_null($$key) && !$$key==="") {
                    trigger_error("unknown parameter",E_USER_NOTICE);
                }
                else {
                    $$key = $value;
                }
            }
        }

        $str_id = $id
            ? "AND ip.id = " . $id .""
            : "";

        $str_item = $item
            ? "AND ip.item = " . $item .""
            : "";

       if(is_null($is_bookmark)){
            $str_bookmark = "";
       }
       else{
           if($is_bookmark){
               $str_bookmark = "AND ip.is_bookmark = 1";
           }
           else{
               $str_bookmark = "AND ip.is_bookmark = 0";
           }
       }

       if(is_null($feedback_requested_by)){
            $str_feedback = "";
       }
       else{
           
           if( is_int($feedback_requested_by) || is_string($feedback_requested_by)){
               $str_feedback = "AND ip.feedback_requested_by = int($feedback_requested_by)";
           }
           else{
               $str_feedback = "AND ip.feedback_requested_by != 0";
           }
       }

        
        if(!is_null($notify_on_change)){
            $str_notify_on_change = 'AND ip.notify_on_change = ' . $notify_on_change;
        }
        else{
            $str_notify_on_change = '';
        }
        
        if(!is_null($notify_if_unchanged_min)){
            $str_notify_if_unchanged_min = 'AND ip.notify_if_unchanged >= ' . $notify_if_unchanged_min;
        }
        else{
            $str_notify_if_unchanged_min = '';
        }
        
        if(!is_null($notify_if_unchanged_max)){
            $str_notify_if_unchanged_max = 'AND ip.notify_if_unchanged <= ' . $notify_if_unchanged_max;
        }
        else{
            $str_notify_if_unchanged_max = '';
        }
        
        if(!is_null($person)){
            $str_query = "SELECT ip.* FROM {$prefix}itemperson ip,  {$prefix}item i
                          WHERE ip.person = " . $person . "
                          AND i.id = ip.item
                          $str_item
                          $str_bookmark
                          $str_id
                          $str_feedback
                          $str_notify_on_change
                          $str_notify_if_unchanged_min
                          $str_notify_if_unchanged_max"
                          . getOrderByString($order_by);

            $sth = $dbh->prepare($str_query);
            $sth->execute("",1);
            $tmp = $sth->fetchall_assoc();
            $itempeople = array();
            foreach($tmp as $t){
                $itemperson = new ItemPerson($t);
                $itempeople[] = $itemperson;
            }

            return $itempeople;
        }
        else{
            return NULL;
        }
    }
    
    static function checkChangedItem($args=NULL){
        global $auth;
        
        $prefix = confGet('DB_TABLE_PREFIX');
        $dbh = new DB_Mysql;

        ## default parameter ##
        $item             = NULL;
        $notify_on_change = NULL;

        ### filter params ###
        if($args) {
            foreach($args as $key=>$value) {
                if(!isset($$key) && !is_null($$key) && !$$key==="") {
                    trigger_error("unknown parameter",E_USER_NOTICE);
                }
                else {
                    $$key = $value;
                }
            }
        }
        
        $str_query = "SELECT * FROM {$prefix}itemperson
                      WHERE item = " . $item . "
                      AND notify_on_change = " . $notify_on_change . "
                      AND person != " . $auth->cur_user->id . ";";

        $sth = $dbh->prepare($str_query);
        $sth->execute("",1);
        $tmp = $sth->fetchall_assoc();
        
        if($tmp){
            return $tmp;
        }
        else{
            return NULL;
        }
        
        return NULL;
    }
    
    static function getPeople($item=NULL,$notify_on_change=NULL)
    {
        global $auth;

        $prefix = confGet('DB_TABLE_PREFIX');
        $dbh = new DB_Mysql;
        
        if(!is_null($item) && !is_null($notify_on_change)){
            $str_query = "SELECT ip.person, p.office_email, p.personal_email 
                          FROM {$prefix}itemperson ip, {$prefix}person p
                          WHERE ip.item = " . $item . "
                          AND ip.notify_on_change = " . $notify_on_change . "
                          AND ip.person = p.id;";
            $sth = $dbh->prepare($str_query);
            $sth->execute("",1);
            $tmp = $sth->fetchall_assoc();
            if($tmp){
                return $tmp;
            }
        }
        else{
            return NULL;
        }
        
        return NULL;
    }
    
    public function update($args=NULL, $update_modifier=true)
    {
        global $auth;
        $dbh = new DB_Mysql;

        $prefix= confGet('DB_TABLE_PREFIX');

        $update_fields = NULL;

        ### build hash to fast access ##
        if($args) {
            $update_fields = array();
            foreach($args as $a) {
                $update_fields[$a] = true;
            }
        }

        if(!$this->id) {
          trigger_error("User object without id can't be updated", E_USER_WARNING);
        }
        if(!sizeof($this->field_states)) {
            trigger_error("need members to update to database. e.g. 'firstname,lastname,data'", E_USER_WARNING);
        }

        $t_pairs=array();          # the 'id' field is skipped later, because it's defined as project-item-field. so we have to add it here
        foreach($this->fields as $f) {
            $name= $f->name;

            ### selective updates ###
            if($update_fields && !isset($update_fields[$name])) {
                continue;
            }

            ### skip project-item fields ###
            if((isset($this->fields[$name]) && isset($this->fields[$name]->in_db_object)) || !isset($g_item_fields[$name])){

                if(!isset($this->$name) && $this->$name!=NULL) {
                    trigger_error("$name is not a member of $this and can't be passed to db", E_USER_WARNING);
                    continue;
                }
                if(isset($this->_values_org[$name])) {
                    if (  $this->_values_org[$name] == stripslashes($this->$name)) {
                        continue;
                    }
                    else if($this->fields[$name]->log_changes) {
                        $log_changed_fields[]=$name;
                    }
                }
                global $sql_obj;
                $t_pairs[]= $name.'='."'". asSecureString($this->$name)."'";
            }
        }
        if(count($t_pairs)) {
            $str_query= 'UPDATE '
                        .$prefix.$this->_type
                        .' SET ' . join(', ', $t_pairs)
                        .' WHERE id='.$this->id ;
            $sth= $dbh->prepare($str_query);
            $sth->execute("",1);
        }
    }
}


?>
